package com.cardone.persistent.support;

import java.util.List;
import java.util.Map;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang3.StringUtils;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.util.CollectionUtils;

import com.cardone.common.cache.util.CacheUtils;
import com.cardone.common.router.support.RouterKeySupport;
import com.cardone.context.ContextHolder;
import com.cardone.context.function.Execution1Function;
import com.google.common.collect.Lists;

/**
 * NamedParameterJdbcTemplate路由支持
 *
 * @author yaohaitao
 *
 */
@Getter
@Setter
@Accessors(chain = true)
@Slf4j
public class NamedParameterJdbcTemplateRouterSupport {
	/**
	 * 默认目标
	 */
	private NamedParameterJdbcTemplate defaultTargetNamedParameterJdbcTemplate;

	/**
	 * 路由键名
	 */
	private RouterKeySupport routerKeySupport;

	/**
	 * 目标
	 */
	private Map<String, NamedParameterJdbcTemplate> targetNamedParameterJdbcTemplates;

	/**
	 * 使用对应目标数据源的NamedParameterJdbcTemplateSupport
	 *
	 * @param value
	 *          值
	 * @param model
	 *          model
	 * @return NamedParameterJdbcTemplate
	 */
	public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(final String value, final Object model) {
		if (StringUtils.isBlank(value)) {
			return this.defaultTargetNamedParameterJdbcTemplate;
		}

		if (CollectionUtils.isEmpty(this.targetNamedParameterJdbcTemplates)) {
			return this.defaultTargetNamedParameterJdbcTemplate;
		}

		if (this.routerKeySupport == null) {
			return this.defaultTargetNamedParameterJdbcTemplate;
		}

		String groupId = null;

		if (StringUtils.isNotBlank(ContextHolder.getId())) {
			groupId = CacheUtils.getCacheValue(String.class, NamedParameterJdbcTemplateRouterSupport.class.getName(), ContextHolder.getId());
		}

		final String contextGroupId = groupId;

		final List<Object> namedParameterJdbcTemplateKeyList = Lists.newArrayList(contextGroupId, value, model);

		final String targetNamedParameterJdbcTemplateKey = CacheUtils.getCacheValue(NamedParameterJdbcTemplateRouterSupport.class.getName(), namedParameterJdbcTemplateKeyList, new Execution1Function<String, Object>() {
			@Override
			public String execution(Object t) {
				return NamedParameterJdbcTemplateRouterSupport.this.routerKeySupport.readKeyByGroupId(contextGroupId, value, model);
			}
		});

		if (NamedParameterJdbcTemplateRouterSupport.log.isDebugEnabled()) {
			NamedParameterJdbcTemplateRouterSupport.log.debug(value + "的标识为：" + targetNamedParameterJdbcTemplateKey);
		}

		if (this.targetNamedParameterJdbcTemplates.containsKey(targetNamedParameterJdbcTemplateKey)) {
			return this.targetNamedParameterJdbcTemplates.get(targetNamedParameterJdbcTemplateKey);
		}

		return this.defaultTargetNamedParameterJdbcTemplate;
	}
}
